﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using InnvoiceActual.Logica.GestorDB;
using InnvoiceActual.Logica.GestorObject.Articulo;
using InnvoiceActual.Ws.Clientes.Reportes;
using InnvoiceActual.Logica.GestorObject;

namespace InnvoiceActual.Ws.Articulos.SubArticulos
{
    /// <summary>
    /// Lógica de interacción para MostrarSubArticulos.xaml
    /// </summary>
    public partial class MostrarSubArticulos : Window
    {
        //Variables
        List<SubArticulo> subArticulosActivos = new List<SubArticulo>();
        List<SubArticulo> subArticulosDesactivados = new List<SubArticulo>();
        EmpresaCS empresa = EmpresaCS.Instance;

        public delegate void EnviarSubArticulo(SubArticulo sender);

        public EnviarSubArticulo enviarSubArticulo;

        private int _codigoArticulo;
        private int _codigoCategoria;
        private bool buscandoSubArticulo = false; //Utilizada cuando se utiliza la ventana para elegir el Sub Articulo

        SubArticulo itemSeleccionado = new SubArticulo();
        int indexSeleccionado = -1;

        //Bases de Datos
        ArticuloDB articuloDB = new ArticuloDB();
        AlicuotaDB alicuotaDB = new AlicuotaDB();
        

        public MostrarSubArticulos()
        {
            _codigoArticulo = -1;
            _codigoCategoria = -1;
            buscandoSubArticulo = false;
            InitializeComponent();
        }

        public MostrarSubArticulos(int codigoArticulo, int codigoCategoria)
        {
            _codigoArticulo = codigoArticulo;
            _codigoCategoria = codigoCategoria;
            buscandoSubArticulo = true;
            InitializeComponent();
        }

        #region Windows Methods

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            CargarSubArticulos();
        }

        private void btnAgregarSubArticulo_Click(object sender, RoutedEventArgs e)
        {
            AgregarElemento();
        }

        private void btnDesactivar_Click(object sender, RoutedEventArgs e)
        {
            DesactivarElemento();
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "F1":
                    AgregarElemento();
                    break;
                case "F2":
                    DesactivarElemento();
                    break;
                case "F3":
                    Listar();
                    break;
                case "ESCAPE":
                    Regresar();
                    break;
                case "F12":
                    Regresar();
                    break;
                default:
                    return;
            }
        }

        private void btnCerarVentana_Click(object sender, RoutedEventArgs e)
        {
            Regresar();
        }

        private void subArticuloDataGridActivos_DoubleClick(object sender, MouseButtonEventArgs e)
        {
            CargarCampos_A_Modificar();
        }

        private void btnGuardarModificado_Click(object sender, RoutedEventArgs e)
        {
            ActualizarItem();
            Limpiar_y_DesactivarCampos();
        }

        private void subArticuloDataGridDesactivados_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            ActivarElemento();
        }

        private void Window_Activated(object sender, EventArgs e)
        {
            CargarSubArticulos();
        }

        #endregion

        #region Auxiliar Methods

        private void CargarSubArticulos()
        {
            if (_codigoArticulo == -1 && _codigoCategoria == -1)
            {
                subArticulosActivos = articuloDB.ObtenerSubArticulosSegunEstado(1);
            }
            else
            {
                subArticulosActivos = articuloDB.ObtenerSubArticulosConDescripcion(_codigoArticulo, _codigoCategoria);
            }
            
            subArticulosDesactivados = articuloDB.ObtenerSubArticulosSegunEstado(0);

            subArticuloDataGridActivos.ItemsSource = subArticulosActivos;
            subArticuloDataGridActivos.Items.Refresh();

            subArticuloDataGridDesactivados.ItemsSource = subArticulosDesactivados;
            subArticuloDataGridDesactivados.Items.Refresh();
        }

        private void AgregarElemento()
        {
            AltaSubArticulo altaSubArticulo = new AltaSubArticulo();
            altaSubArticulo.Show();
        }

        private void CargarCampos_A_Modificar()
        {
            itemSeleccionado = (SubArticulo)subArticuloDataGridActivos.SelectedItem;
            indexSeleccionado = subArticuloDataGridActivos.Items.IndexOf(itemSeleccionado);

            if (!itemSeleccionado.Equals(null) && indexSeleccionado > -1)
            {
                this.descripcionValue.Text = itemSeleccionado.Descripcion;
                this.descripcionValue.IsEnabled = true;

                this.precioValue.Text = itemSeleccionado.PrecioNeto.ToString();
                this.precioValue.IsEnabled = true;

                List<Alicuota> alicuotas = new List<Alicuota>();
                alicuotas = alicuotaDB.GetAlicuotas(1);

                int indexSeleccionadoAlicuota = 0;

                while (!(alicuotas[indexSeleccionadoAlicuota].Tasa.Equals(itemSeleccionado.Codigo_Alicuota_Tasa)))
                {
                    indexSeleccionadoAlicuota++;
                }

                alicuotaComboBox.ItemsSource = alicuotas;
                alicuotaComboBox.SelectedIndex = indexSeleccionadoAlicuota;
                alicuotaComboBox.Items.Refresh();

                alicuotaComboBox.IsEnabled = true;
            }
        }

        private void ActualizarItem()
        {
            itemSeleccionado.Descripcion = descripcionValue.Text;
            itemSeleccionado.PrecioNeto = Convert.ToDecimal(precioValue.Text);
            itemSeleccionado.Codigo_Alicuota = ((Alicuota)alicuotaComboBox.SelectedItem).Codigo_Alicuota;
            articuloDB.UpdateSubArticulo(itemSeleccionado, false);

            ActualizarListas();
        }

        private void Limpiar_y_DesactivarCampos()
        {
            descripcionValue.Text = "";
            descripcionValue.IsEnabled = false;

            precioValue.Text = "";
            precioValue.IsEnabled = false;

            alicuotaComboBox.IsEnabled = false;
            alicuotaComboBox.ItemsSource = null;
        }

        //Borra el elemento seleccionado
        private void DesactivarElemento()
        {
            if (subArticuloDataGridActivos.SelectedItems.Count == 1)
            {
                SubArticulo auxSubArticulo = (SubArticulo)subArticuloDataGridActivos.SelectedItem;
                SubArticulo subArticulo = articuloDB.ObtenerSubArticulo(auxSubArticulo.Codigo, auxSubArticulo.CodigoArticulo, auxSubArticulo.CodigoCategoria);
                MessageBoxResult resultado = MessageBox.Show("Realmente desea desactivar el Sub Articulo " + subArticulo.Descripcion + " ?", "Desactivar SubArticulo", MessageBoxButton.YesNoCancel, MessageBoxImage.Exclamation);

                switch (resultado.ToString())
                {
                    case "Yes":
                        articuloDB.DesactivarSubArticulo(subArticulo);
                        break;
                    default:
                        return;
                }
            }
            else if (subArticuloDataGridActivos.SelectedItems.Count < 1)
            {
                MessageBox.Show("Seleccione el elemento a desactivar", "Atencion", MessageBoxButton.OK, MessageBoxImage.Information);
            }
            else
            {
                MessageBox.Show("Debe seleccionar SOLO UN Sub Articulo a desactivar", "Atencion", MessageBoxButton.OK, MessageBoxImage.Error);
            }

            ActualizarListas();
            Limpiar_y_DesactivarCampos();
        }

        private void ActivarElemento()
        {
            SubArticulo auxSubArticulo = (SubArticulo)subArticuloDataGridDesactivados.SelectedItem;
            SubArticulo subArticulo = articuloDB.ObtenerSubArticulo(auxSubArticulo.Codigo, auxSubArticulo.CodigoArticulo, auxSubArticulo.CodigoCategoria);
            MessageBoxResult resultado = MessageBox.Show("Realmente desea ACTIVAR el Sub Articulo " + subArticulo.Descripcion + " ?", "Activar SubArticulo", MessageBoxButton.YesNoCancel, MessageBoxImage.Exclamation);
            switch (resultado.ToString())
            {
                case "Yes":
                    articuloDB.ActivarSubArticulo(subArticulo);
                    break;
                default:
                    return;
            }

            ActualizarListas();
            Limpiar_y_DesactivarCampos();
        }

        private void ActualizarListas()
        {
            subArticuloDataGridActivos.ItemsSource = articuloDB.ObtenerSubArticulosSegunEstado(1);
            subArticuloDataGridActivos.Items.Refresh();

            subArticuloDataGridDesactivados.ItemsSource = articuloDB.ObtenerSubArticulosSegunEstado(0);
            subArticuloDataGridDesactivados.Items.Refresh();
        }

        private void Listar()
        {
            string miRdlc = "InnvoiceActual.Ws.Articulos.Reportes.RptSubArticulo.rdlc";
            string miNameDataSet = "DataSetSubArticulo";
            List<SubArticulo> listaSubArticulo = articuloDB.ObtenerSubArticulosConDescripcion(-1,-1);
            FReporte rp = new FReporte(listaSubArticulo, miRdlc, miNameDataSet);
            rp.Show();
        }

        public void Regresar()
        {
            if ((subArticuloDataGridActivos.SelectedIndex >= 0) && (subArticuloDataGridActivos.Items.Count >= 0) && buscandoSubArticulo)
                enviarSubArticulo(subArticulosActivos[subArticuloDataGridActivos.SelectedIndex]);
            this.Close();
        }

        #endregion
    }
}
